﻿Imports System.Data
Imports System.Collections.ObjectModel
Imports System.Text
Imports System.Windows.Controls.Primitives
Imports Microsoft.Office.Interop.Excel
Imports Microsoft.Office.Interop
Imports System.IO
Imports System.Threading

Public Class CAPICContingencia

    Private dtOrdenesPos As New System.Data.DataTable()
    Private dtOrdenesEfe As New System.Data.DataTable()
    Private ordenEnEdicion As COrdenAPICContingencia
    Private APICServicio As New CAPICContingenciaServicio()
    Private MaxRenglones As Integer
    Private servGrales As New CServiciosGenerales()

    Public Sub New()
        InitializeComponent()
        Me.grdOrdenesPos.ItemsSource = New ObservableCollection(Of COrdenAPICContingencia)
        Me.grdOrdenesEfe.ItemsSource = New ObservableCollection(Of COrdenAPICContingencia)
        MaxRenglones = APICServicio.ObtieneMaxRenglones()
        Try
            APICServicio.ObtieneInstrumentos()
        Catch ex As Exception
            APICServicio.ObtieneInstrumentos()
        End Try

        Try
            APICServicio.ObtienePortafolios()
        Catch ex As Exception
            APICServicio.ObtienePortafolios()
        End Try

        Mouse.OverrideCursor = Nothing
    End Sub

#Region "TAB POSICION"

    Private Sub grdOrdenesPos_MouseRightButtonUp(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles grdOrdenesPos.MouseRightButtonUp
        Dim objDepend As DependencyObject = e.OriginalSource
        Dim celda As DataGridCell = Nothing
        Dim maxColumns = Me.grdOrdenesPos.Columns.Count
        Me.grdOrdenesPos.ContextMenu = Nothing
        While Not objDepend Is Nothing
            If objDepend.GetType().Name = "DataGridCell" Then
                celda = objDepend
                If celda.IsSelected = False Then
                    Me.grdOrdenesPos.UnselectAllCells()
                    celda.IsSelected = True
                End If

                celda.Focus()

                If celda.TabIndex <> maxColumns Then
                    Me.grdOrdenesPos.ContextMenu = AgregarMenuContextual(0)
                End If

                Exit While
            End If
            objDepend = VisualTreeHelper.GetParent(objDepend)
        End While
    End Sub

    Private Sub btnAgregarOrdenPos_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnAgregarOrdenPos.Click
        Dim ordenNueva As COrdenAPICContingencia = New COrdenAPICContingencia()
        Dim lstOrdenes As New ObservableCollection(Of COrdenAPICContingencia)

        Me.grdOrdenesPos.UnselectAllCells()
        Me.grdOrdenesPos.UpdateLayout()

        lstOrdenes = Me.grdOrdenesPos.ItemsSource
        lstOrdenes.Add(ordenNueva)

        Me.grdOrdenesPos.ScrollIntoView(Me.grdOrdenesPos.Items(Me.grdOrdenesPos.Items.Count - 1))
        Me.grdOrdenesPos.UpdateLayout()

        Dim celda As DataGridCell = ObtenerCelda(Me.grdOrdenesPos, Me.grdOrdenesPos.Items.Count - 1, 0)
        If Not celda Is Nothing Then
            celda.Focus()
            Me.grdOrdenesPos.BeginEdit()
            celda.IsSelected = True
        End If

        ValidaCantidadDatos(Me.grdOrdenesPos)
    End Sub

    Private Sub btnEliminaOrdenPos_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnEliminaOrdenPos.Click
        Dim ordenes As ObservableCollection(Of COrdenAPICContingencia) = Me.grdOrdenesPos.ItemsSource
        Dim ordenEliminar As New ObservableCollection(Of COrdenAPICContingencia)
        Dim ordenAgregado As New COrdenAPICContingencia()
        Dim ordenRecorrido As New COrdenAPICContingencia()

        If Me.grdOrdenesPos.SelectedCells.Count > 0 Then
            For Each celda As DataGridCellInfo In Me.grdOrdenesPos.SelectedCells
                ordenEliminar.Add(CType(celda.Item, COrdenAPICContingencia))
            Next

            For Each T As COrdenAPICContingencia In ordenEliminar
                ordenes.Remove(T)
            Next

            Me.grdOrdenesPos.UpdateLayout()
        Else
            Dim msgBorrado As MessageBoxResult

            msgBorrado = MessageBox.Show("¿Desea borrar todos los registros no utilizados?", "Borrado ordenes", MessageBoxButton.YesNo, MessageBoxImage.Question)

            If (msgBorrado = MessageBoxResult.Yes) Then
                For Each ctAux As COrdenAPICContingencia In ordenes
                    If ctAux.RollUpCode = "" And ctAux.Serie = "" And ctAux.ValueType = "" And ctAux.RefCurveCode = "" And ctAux.NumShares = "0" And ctAux.IdFuenteInfo = "" Then
                        ordenEliminar.Add(ctAux)
                    End If
                Next

                For Each T As COrdenAPICContingencia In ordenEliminar
                    ordenes.Remove(T)
                Next

                Me.grdOrdenesPos.UpdateLayout()
                Me.grdOrdenesPos.Items.Refresh()
            End If
        End If

        ValidaCantidadDatos(Me.grdOrdenesPos)
    End Sub

    Private Sub grdOrdenesPos_BeginningEdit(ByVal sender As System.Object, ByVal e As System.Windows.Controls.DataGridBeginningEditEventArgs) Handles grdOrdenesPos.BeginningEdit
        ordenEnEdicion = Me.grdOrdenesPos.CurrentItem
    End Sub

    Private Sub grdOrdenesPos_CellEditEnding(ByVal sender As System.Object, ByVal e As System.Windows.Controls.DataGridCellEditEndingEventArgs) Handles grdOrdenesPos.CellEditEnding
        Dim ordenCambio As COrdenAPICContingencia = New COrdenAPICContingencia()
        Dim ordenActual As COrdenAPICContingencia
        Dim ordenes As ObservableCollection(Of COrdenAPICContingencia) = Me.grdOrdenesPos.ItemsSource

        Select Case e.EditAction
            Case DataGridEditAction.Cancel
                ordenCambio = TryCast(Me.grdOrdenesPos.Items(Me.grdOrdenesPos.Items.Count - 1), COrdenAPICContingencia)

                If ordenCambio.EsEditableNuevo Then
                    ordenes.Remove(ordenCambio)
                    Me.grdOrdenesPos.UpdateLayout()
                End If
            Case DataGridEditAction.Commit
                If Not sender.CurrentItem Is Nothing Then
                    Dim txtContenidoCelda As Object = sender.Columns(e.Column.DisplayIndex).GetCellContent(sender.CurrentItem)
                    Dim Columna As Integer = e.Column.DisplayIndex
                    ordenActual = TryCast(Me.grdOrdenesPos.CurrentCell.Item, COrdenAPICContingencia)

                    Try
                        If Columna = 4 Then
                            DirectCast(txtContenidoCelda, System.Windows.Controls.TextBox).Text = Convert.ToDouble(DirectCast(txtContenidoCelda, System.Windows.Controls.TextBox).Text).ToString("###,##0")
                        End If
                    Catch ex As Exception
                    End Try
                    ordenActual.EsEditableNuevo = False
                End If
        End Select

        ordenEnEdicion = Nothing
    End Sub

    Private Sub grdOrdenesPos_PreviewKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Input.KeyEventArgs) Handles grdOrdenesPos.PreviewKeyDown
        If Keyboard.Modifiers = ModifierKeys.Control AndAlso e.Key = Key.C Then
            Try
                If copiarCeldas(Me.grdOrdenesPos) = False Then
                    MessageBox.Show("El rango de celdas seleccionado no es correcto, si está editando la celda favor de cancelar la edición y proceder con el copiado.", "Copiar celdas", MessageBoxButton.OK, MessageBoxImage.Exclamation)
                End If
            Catch ex As Exception
                MessageBox.Show("Error TI500. Al intentar copiar celdas: " & ex.Message, "Copiado", MessageBoxButton.OK, MessageBoxImage.Error)
            End Try
        End If
        If Keyboard.Modifiers = ModifierKeys.Control AndAlso e.Key = Key.V Then
            Try
                Dim col As Integer = Me.grdOrdenesPos.CurrentCell.Column.DisplayIndex
                Dim row As Integer = Me.grdOrdenesPos.Items.IndexOf(CType(Me.grdOrdenesPos.CurrentCell.Item, COrdenAPICContingencia))
                Dim celda As DataGridCell = ObtenerCelda(Me.grdOrdenesPos, row, col)

                Me.grdOrdenesPos.CancelEdit()
                pegarDatos(Me.grdOrdenesPos)

            Catch ex As Exception
                MessageBox.Show("Error TI500. " & ex.Message, "Pegar celdas", MessageBoxButton.OK, MessageBoxImage.Error)

                Me.grdOrdenesPos.CancelEdit(DataGridEditingUnit.Cell)
            End Try
        End If
        If e.Key = Key.Delete Then
            Try
                Dim col As Integer = Me.grdOrdenesPos.CurrentCell.Column.DisplayIndex
                Dim row As Integer = Me.grdOrdenesPos.Items.IndexOf(CType(Me.grdOrdenesPos.CurrentCell.Item, COrdenAPICContingencia))
                Dim celda As DataGridCell = ObtenerCelda(Me.grdOrdenesPos, row, col)

                If celda.IsEditing = False Then
                    BorraDatosSeleccionados(Me.grdOrdenesPos)
                End If
            Catch ex As Exception
                MessageBox.Show("Error TI500. " & ex.Message, "Borrar contenido de celdas", MessageBoxButton.OK, MessageBoxImage.Error)
            End Try
        End If
    End Sub

    Private Sub btnInsertarOrdenPos_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnInsertarOrdenPos.Click
        Try
            InsertarDatos(Me.grdOrdenesPos)
        Catch ex As Exception
            MessageBox.Show("Error TI500. " & ex.Message, "Insertar registros", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub grdOrdenesPos_LoadingRow(ByVal sender As System.Object, ByVal e As System.Windows.Controls.DataGridRowEventArgs) Handles grdOrdenesPos.LoadingRow
        Dim orden As COrdenAPICContingencia = TryCast(e.Row.Item, COrdenAPICContingencia)
        Dim row As DataRowView = TryCast(e.Row.Item, DataRowView)
        If orden.Mensaje <> "" Then
            e.Row.Background = New SolidColorBrush(Color.FromArgb(255, 242, 220, 219))
        Else
            e.Row.Background = New SolidColorBrush(Color.FromArgb(255, 255, 255, 255))
        End If
    End Sub

    Private Sub btnCargaArchivoPos_Click(ByVal sender As System.Object, ByVal e As RoutedEventArgs) Handles btnCargaArchivoPos.Click
        Dim dlg As New Microsoft.Win32.OpenFileDialog()
        Dim blnArchivoElegido As Boolean
        '123
        Dim eventoBit = CBitacoraFRIDA.GenerarEvento(CBitacoraFRIDA.CveEventosBit.CARGAR_ARCHIVO_POS, CServiciosMacrosSyBaseDB.IDUSUARIO, "CAPICContingencia.xaml -> btnCargaArchivoPos")

        Try
            dlg.FileName = ""
            dlg.DefaultExt = ".png"
            dlg.Filter = "Excel documents|*.xls;*.xlsx"

            blnArchivoElegido = dlg.ShowDialog()

            If blnArchivoElegido Then
                If Me.grdOrdenesPos.Items.Count > 0 Then
                    Dim msgPregunta As MessageBoxResult = MessageBox.Show("Al cargar el archivo toda la información que se ha ingresado se perderá, ¿Desea continuar?", "Carga archivo", MessageBoxButton.YesNo, MessageBoxImage.Question)

                    If msgPregunta = MessageBoxResult.Yes Then
                        GoTo continua
                    Else
                        Return
                    End If
                Else
                    GoTo continua
                End If

continua:

                eventoBit.GuadarDetalle("archivo", dlg.FileName)

                Dim lstOrdenes As New ObservableCollection(Of COrdenAPICContingencia)
                Dim wbk As Workbook
                Dim hoja As Worksheet
                Dim Aplicacion As _Application
                Dim rango As Range
                Dim indice As Integer = 0, indiceAux As Integer = 2, TotalRenglones As Integer, TotalColumnas As Integer
                Dim strNombreAuxiliar As String

                Mouse.OverrideCursor = Cursors.Wait

                lstOrdenes = Me.grdOrdenesPos.ItemsSource
                lstOrdenes.Clear()
                Me.grdOrdenesPos.UpdateLayout()

                Try
                    Aplicacion = GetObject(, "Excel.Application")
                Catch ex As Exception
                    Aplicacion = CreateObject("Excel.Application")
                End Try

                While indice >= 0
                    indice = dlg.FileName.IndexOf("\", indiceAux)

                    If indice > 0 Then
                        indiceAux = indice + 1
                    End If
                End While

                strNombreAuxiliar = dlg.FileName.Substring(indiceAux, dlg.FileName.Length - indiceAux)

                For Each wbAux As Workbook In Aplicacion.Workbooks
                    If wbAux.Name = strNombreAuxiliar Then
                        wbAux.Close()
                    End If
                Next

                Try
                    wbk = Aplicacion.Workbooks.Open(dlg.FileName)
                Catch ex As Exception
                    Dim errorBit = eventoBit.GuardarError("Error al cargar archivo: " & ex.Message)
                    eventoBit.ActualizarFechaFinDelEvento()
                    Mouse.OverrideCursor = Nothing

                    MessageBox.Show("Error TI500. " & ex.Message & " Si esta modificando otro libro favor de terminar e intentar nuevamente " & " -Codigo:" & errorBit.IdError, "Carga archivo", MessageBoxButton.OK, MessageBoxImage.Error)

                    Exit Sub
                End Try

                hoja = wbk.Sheets(1)

                rango = hoja.UsedRange

                TotalRenglones = rango.Rows.Count

                TotalColumnas = rango.Columns.Count

                Dim InicioRenglon As Integer = 1
                Dim InicioRenglonDatos As Integer = 0
                Dim ExcelColumns(Me.grdOrdenesPos.Columns.Count + 1) As Integer
                'Encontrar columnas de layout

                If MaxRenglones > TotalRenglones Then
                    MaxRenglones = TotalRenglones
                End If

                For renglon = 1 To MaxRenglones Step 1
                    For columna = 1 To TotalColumnas Step 1
                        If Not hoja.Cells(renglon, columna).Value2 Is Nothing Then
                            If EncontrarEncabezado(hoja.Cells(renglon, columna).Value2, Me.grdOrdenesPos) Then
                                InicioRenglon = renglon
                                Exit For
                                Exit For
                            End If

                        End If
                    Next
                Next

                For grdcolumna = 0 To Me.grdOrdenesPos.Columns.Count - 1 Step 1
                    For columna = 1 To TotalColumnas Step 1
                        If Not hoja.Cells(InicioRenglon, columna).Value2 Is Nothing Then
                            If grdcolumna = 4 Then
                                If hoja.Cells(InicioRenglon, columna).Value2.ToString.ToUpper.Contains(Me.grdOrdenesPos.Columns(grdcolumna).Header.ToString.Replace("__", "_").ToUpper) _
                                    And hoja.Cells(InicioRenglon, columna).Value2.ToString.ToUpper.Contains(" VS ") Then
                                    ExcelColumns(grdcolumna) = columna
                                    InicioRenglonDatos = InicioRenglon + 1
                                    Exit For
                                End If
                            Else
                                If hoja.Cells(InicioRenglon, columna).Value2.ToString.ToUpper.Contains(Me.grdOrdenesPos.Columns(grdcolumna).Header.ToString.Replace("__", "_").ToUpper) Then
                                    ExcelColumns(grdcolumna) = columna
                                    InicioRenglonDatos = InicioRenglon + 1
                                    Exit For
                                End If
                            End If

                        End If
                    Next

                Next

                If ExcelColumns(5) <> 0 Then
                    For columna = 1 To TotalColumnas Step 1
                        If Not hoja.Cells(InicioRenglon, columna).Value2 Is Nothing Then
                            If hoja.Cells(InicioRenglon, columna).Value2.ToString.ToUpper.Contains(Me.grdOrdenesPos.Columns(4).Header.ToString.Replace("__", "_").ToUpper) Then
                                ExcelColumns(4) = columna
                                Exit For
                            End If
                        End If
                    Next
                End If

                If InicioRenglonDatos = 0 Then
                    wbk.Close()
                    Mouse.OverrideCursor = Nothing
                    eventoBit.GuadarDetalle("Mensaje carga", "No existe ninguna columna correspondiente al layout.")
                    MessageBox.Show("No existe ninguna columna correspondiente al layout. Por favor verifique el archivo e intente subirlo nuevamente", "Carga archivo", MessageBoxButton.OK, MessageBoxImage.Exclamation)
                Else
                    If InicioRenglonDatos <= TotalRenglones Then
                        For renglon = InicioRenglonDatos To TotalRenglones Step 1
                            Dim ordenExcel As New COrdenAPICContingencia()

                            For i = 0 To Me.grdOrdenesPos.Columns.Count - 1 Step 1
                                If ExcelColumns(i) <> 0 Then
                                    If Not hoja.Cells(renglon, ExcelColumns(i)).Value2 Is Nothing Then
                                        Dim colname As Integer = COrdenAPICContingencia.IndexColumna(Me.grdOrdenesPos.Columns(i).Header.ToString.Replace("_", ""))
                                        If i = 4 Then
                                            Try
                                                ordenExcel(colname) = Convert.ToDouble(hoja.Cells(renglon, ExcelColumns(i)).Value2.ToString.Trim).ToString("###,##0")
                                            Catch ex As Exception
                                                ordenExcel(colname) = hoja.Cells(renglon, ExcelColumns(i)).Value2.ToString.Trim
                                            End Try

                                        Else
                                            ordenExcel(colname) = hoja.Cells(renglon, ExcelColumns(i)).Value2.ToString.Trim
                                        End If

                                    End If
                                End If
                            Next

                            If ordenExcel.RollUpCode <> "" Or ordenExcel.Serie <> "" Or ordenExcel.ValueType <> "" Or ordenExcel.RefCurveCode <> "" Or (ordenExcel.NumShares <> "0" And ordenExcel.NumShares <> "") Or ordenExcel.IdFuenteInfo <> "" Then
                                lstOrdenes.Add(ordenExcel)
                            End If
                        Next
                    End If

                    wbk.Close()

                    Me.grdOrdenesPos.UpdateLayout()
                    eventoBit.ActualizarFechaFinDelEvento()
                    Mouse.OverrideCursor = Nothing

                    MessageBox.Show("Archivo cargado correctamente", "Carga archivo", MessageBoxButton.OK, MessageBoxImage.Information)
                End If

                ValidaCantidadDatos(Me.grdOrdenesPos)
            End If
        Catch ex As Exception
            Dim errorBit = eventoBit.GuardarError("Error al cargar archivo: " & ex.Message)
            eventoBit.ActualizarFechaFinDelEvento()
            Mouse.OverrideCursor = Nothing
            MessageBox.Show("Error TI500. " & ex.Message & " -Codigo:" & errorBit.IdError, "Carga archivo", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub btnSubirDECALOGPos_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnSubirDECALOGPos.Click
        Dim msgResultado As MessageBoxResult
        Dim strRutaTLOADER As String
        Dim lstOrdenesEvaluar As New ObservableCollection(Of COrdenAPICContingencia)
        lstOrdenesEvaluar = Me.grdOrdenesPos.ItemsSource
        'Me.grdOrdenesPos.Columns(6).Visibility = System.Windows.Visibility.Hidden
        '123
        Dim eventoBit = CBitacoraFRIDA.GenerarEvento(CBitacoraFRIDA.CveEventosBit.CARGAR_APIC_POS_DECALOG, CServiciosMacrosSyBaseDB.IDUSUARIO, "CPICContingencia.xaml -> btnSubirDECALOGPos")
        strRutaTLOADER = APICServicio.ObtieneRutaTLOADERAPIC()

        If File.Exists(strRutaTLOADER) Then
            msgResultado = MessageBox.Show("¿Desea procesar los datos en DECALOG?", "Atención", MessageBoxButton.YesNo, MessageBoxImage.Question)

            If msgResultado = MessageBoxResult.Yes Then
                Mouse.OverrideCursor = Cursors.Wait

                Try
                    Dim strRutaDECALOG As String, strRutaDirectorio As String, strNombrePrefijo As String, strMensajeValidacion As String = String.Empty
                    Dim indice As Integer = 0, indiceAux As Integer = 2

                    APICServicio.ValidarOrdenesPos(lstOrdenesEvaluar, strMensajeValidacion)
                    Me.grdOrdenesPos.ItemsSource = Nothing
                    Me.grdOrdenesPos.ItemsSource = lstOrdenesEvaluar
                    Me.grdOrdenesPos.UpdateLayout()
                    If strMensajeValidacion.Length = 0 Then
                        strRutaDECALOG = APICServicio.ObtieneRutaArchivoAPICPosicion()

                        While indice >= 0
                            indice = strRutaDECALOG.IndexOf("\", indiceAux)

                            If indice > 0 Then
                                indiceAux = indice + 1
                            End If
                        End While

                        strRutaDirectorio = strRutaDECALOG.Substring(0, indiceAux - 1)
                        strNombrePrefijo = strRutaDECALOG.Substring(indiceAux, strRutaDECALOG.Length - indiceAux)

                        If Directory.Exists(strRutaDirectorio) Then
                            Try
                                Dim strConstructor As StringBuilder = New StringBuilder()

                                If (From ordenF In lstOrdenesEvaluar
                                    Where ordenF.Mensaje <> "" Select ordenF).Count > 0 Then
                                    Dim errorBit = eventoBit.GuardarError("Existen errores en registros que se desean enviar a Decalog ")
                                    eventoBit.ActualizarFechaFinDelEvento()
                                    Mouse.OverrideCursor = Nothing
                                    MessageBox.Show("Existen errores en registros que se desean enviar a Decalog.", "Atención", MessageBoxButton.OK, MessageBoxImage.Exclamation)
                                    Exit Sub
                                End If

                                Mouse.OverrideCursor = Cursors.Wait


                                If lstOrdenesEvaluar.Count > 0 Then

                                    Dim NombreFinalArchivo As String = APICServicio.GeneraArchivo(strRutaDirectorio, strNombrePrefijo, lstOrdenesEvaluar, "Pos")
                                    Dim Parametros As String

                                    Parametros = APICServicio.ObtieneParametrosTLOADERAPIC().Replace("@CSMode", "STOP").Replace("@Usuario", CServiciosMacrosSyBaseDB.USUARIO).Replace("@Archivo", NombreFinalArchivo)

                                    Dim intInsercionBitacoraDECALOG As Integer = APICServicio.InsertaBitacoraDECALOG(NombreFinalArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                    If intInsercionBitacoraDECALOG > 0 Then

                                        servGrales.EjecutarProceso(strRutaTLOADER, Parametros, "APICContingencia")

                                        Thread.Sleep(7000)

                                        Dim intVerificacionArchivo As Integer = VerificaArchivoDECALOG(NombreFinalArchivo)

                                        If intVerificacionArchivo = 1 Then
                                            APICServicio.ActualizaBitacoraDECALOG(intInsercionBitacoraDECALOG, intVerificacionArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                            Dim strFolios = ActualizaFolioDECALOG(NombreFinalArchivo, intInsercionBitacoraDECALOG)

                                            tabCompliance.IsEnabled = False
                                            eventoBit.GuadarDetalle("Folios", strFolios)
                                            Mouse.OverrideCursor = Nothing

                                            MessageBox.Show("Operacion realizada con Exito!!. Folio(s) generado(s): " & strFolios, "Generación de órdenes", MessageBoxButton.OK, MessageBoxImage.Information)
                                        ElseIf intVerificacionArchivo = 2 Then
                                            APICServicio.ActualizaBitacoraDECALOG(intInsercionBitacoraDECALOG, intVerificacionArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                            Mouse.OverrideCursor = Nothing
                                            Dim errorBit = eventoBit.GuardarError("Se han encontrado errores o reglas transgedidas")
                                            eventoBit.ActualizarFechaFinDelEvento()
                                            MessageBox.Show("Se han encontrado errores o reglas transgedidas", "Generación de órdenes", MessageBoxButton.OK, MessageBoxImage.Exclamation)

                                            Thread.Sleep(1000)

                                            ActualizaErrorDECALOG(NombreFinalArchivo, intInsercionBitacoraDECALOG)

                                            Dim strContenido As String = File.ReadAllText(NombreFinalArchivo + ".err_text")

                                            tbErrores.Text = strContenido

                                            tabCompliance.IsEnabled = True
                                            tabPosicion.IsSelected = False
                                            tabEfectivo.IsSelected = False
                                            tabCompliance.IsSelected = True
                                        ElseIf intVerificacionArchivo = 0 Then
                                            Dim errorBit = eventoBit.GuardarError("No se obtuvo respuesta de DECALOG")
                                            eventoBit.ActualizarFechaFinDelEvento()
                                            Mouse.OverrideCursor = Nothing

                                            MessageBox.Show("No se obtuvo respuesta de DECALOG, favor de revisar la bitácora de folios para ver el resultado de la operación.", "Generación de órdenes", MessageBoxButton.OK, MessageBoxImage.Exclamation)
                                        ElseIf intVerificacionArchivo = 3 Then
                                            APICServicio.ActualizaBitacoraDECALOG(intInsercionBitacoraDECALOG, intVerificacionArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                            Dim strFolios = ActualizaFolioDECALOG(NombreFinalArchivo, intInsercionBitacoraDECALOG)
                                            eventoBit.GuadarDetalle("Folios", strFolios)
                                            Mouse.OverrideCursor = Nothing

                                            MessageBox.Show("Archivo parcialmente correcto con los folios: " & strFolios & ". También se encontraron errores o reglas transgedidas.", "Generación de órdenes", MessageBoxButton.OK, MessageBoxImage.Exclamation)

                                            Thread.Sleep(1000)

                                            ActualizaErrorDECALOG(NombreFinalArchivo, intInsercionBitacoraDECALOG)
                                            Dim errorBit = eventoBit.GuardarError("Archivo parcialmente correcto con los folios")
                                            eventoBit.ActualizarFechaFinDelEvento()
                                            Dim strContenido As String = File.ReadAllText(NombreFinalArchivo + ".err_text")

                                            tbErrores.Text = strContenido

                                            tabCompliance.IsEnabled = True
                                            tabPosicion.IsSelected = False
                                            tabEfectivo.IsSelected = False
                                            tabCompliance.IsSelected = True
                                        End If
                                    Else
                                        Dim errorBit = eventoBit.GuardarError("Ocurrió un error al guardar el envío del archivo en la bitácora")
                                        eventoBit.ActualizarFechaFinDelEvento()
                                        Mouse.OverrideCursor = Nothing

                                        MessageBox.Show("Ocurrió un error al guardar el envío del archivo en la bitácora", "Generación órdenes", MessageBoxButton.OK, MessageBoxImage.Exclamation)
                                    End If
                                Else
                                    eventoBit.GuadarDetalle("Carga", "No hay órdenes válidas para ser mandadas a DECALOG")
                                    Mouse.OverrideCursor = Nothing

                                    MessageBox.Show("No hay órdenes válidas para ser mandadas a DECALOG", "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Exclamation)

                                    Exit Sub
                                End If
                            Catch ex As Exception
                                Dim errorBit = eventoBit.GuardarError("Error en carga DECALOG " & ex.Message)
                                eventoBit.ActualizarFechaFinDelEvento()
                                Mouse.OverrideCursor = Nothing

                                MessageBox.Show("Error TI500. " & ex.Message, "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Error)
                            End Try
                        Else
                            Dim errorBit = eventoBit.GuardarError("Verificar que existe la ruta: " + strRutaDirectorio)
                            eventoBit.ActualizarFechaFinDelEvento()
                            Mouse.OverrideCursor = Nothing

                            MessageBox.Show("Verificar que existe la ruta: " + strRutaDirectorio + " para almacenar el archivo a procesar en DECALOG", "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Exclamation)
                        End If
                    Else
                        Dim errorBit = eventoBit.GuardarError("Ocurrió un error al validar la información")
                        eventoBit.ActualizarFechaFinDelEvento()
                        Mouse.OverrideCursor = Nothing

                        MessageBox.Show("Ocurrió un error al validar la información", "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Exclamation)
                    End If
                Catch ex As Exception
                    Dim errorBit = eventoBit.GuardarError(ex.Message)
                    eventoBit.ActualizarFechaFinDelEvento()
                    Mouse.OverrideCursor = Nothing

                    MessageBox.Show("Error TI500. " & ex.Message, "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Error)
                End Try
            End If
        Else
            Dim errorBit = eventoBit.GuardarError("Verificar que existe el archivo: " + strRutaTLOADER)
            eventoBit.ActualizarFechaFinDelEvento()
            MessageBox.Show("Verificar que existe el archivo: " + strRutaTLOADER + " para poder cargar los archivos a DECALOG", "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Exclamation)
        End If
    End Sub

#End Region

#Region "TAB EFECTIVO"

    Private Sub grdOrdenesEfe_MouseRightButtonUp(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles grdOrdenesEfe.MouseRightButtonUp
        Dim objDepend As DependencyObject = e.OriginalSource
        Dim celda As DataGridCell = Nothing
        Dim maxColumns = Me.grdOrdenesEfe.Columns.Count
        Me.grdOrdenesEfe.ContextMenu = Nothing
        While Not objDepend Is Nothing
            If objDepend.GetType().Name = "DataGridCell" Then
                celda = objDepend
                If celda.IsSelected = False Then
                    Me.grdOrdenesEfe.UnselectAllCells()
                    celda.IsSelected = True
                End If

                celda.Focus()

                If celda.TabIndex <> maxColumns Then
                    Me.grdOrdenesEfe.ContextMenu = AgregarMenuContextual(0)
                End If

                Exit While
            End If
            objDepend = VisualTreeHelper.GetParent(objDepend)
        End While
    End Sub

    Private Sub btnAgregarOrdenEfe_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnAgregarOrdenEfe.Click
        Dim ordenNueva As COrdenAPICContingencia = New COrdenAPICContingencia()
        Dim lstOrdenes As New ObservableCollection(Of COrdenAPICContingencia)

        Me.grdOrdenesEfe.UnselectAllCells()
        Me.grdOrdenesEfe.UpdateLayout()

        lstOrdenes = Me.grdOrdenesEfe.ItemsSource
        lstOrdenes.Add(ordenNueva)

        Me.grdOrdenesEfe.ScrollIntoView(Me.grdOrdenesEfe.Items(Me.grdOrdenesEfe.Items.Count - 1))
        Me.grdOrdenesEfe.UpdateLayout()

        Dim celda As DataGridCell = ObtenerCelda(Me.grdOrdenesEfe, Me.grdOrdenesEfe.Items.Count - 1, 0)
        If Not celda Is Nothing Then
            celda.Focus()
            Me.grdOrdenesEfe.BeginEdit()
            celda.IsSelected = True
        End If

        ValidaCantidadDatos(Me.grdOrdenesEfe)
    End Sub

    Private Sub btnEliminaOrdenEfe_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnEliminaOrdenEfe.Click
        Dim ordenes As ObservableCollection(Of COrdenAPICContingencia) = Me.grdOrdenesEfe.ItemsSource
        Dim ordenEliminar As New ObservableCollection(Of COrdenAPICContingencia)
        Dim ordenAgregado As New COrdenAPICContingencia()
        Dim ordenRecorrido As New COrdenAPICContingencia()

        If Me.grdOrdenesEfe.SelectedCells.Count > 0 Then
            For Each celda As DataGridCellInfo In Me.grdOrdenesEfe.SelectedCells
                ordenEliminar.Add(CType(celda.Item, COrdenAPICContingencia))
            Next

            For Each T As COrdenAPICContingencia In ordenEliminar
                ordenes.Remove(T)
            Next

            Me.grdOrdenesEfe.UpdateLayout()
        Else
            Dim msgBorrado As MessageBoxResult

            msgBorrado = MessageBox.Show("¿Desea borrar todos los registros no utilizados?", "Borrado ordenes", MessageBoxButton.YesNo, MessageBoxImage.Question)

            If (msgBorrado = MessageBoxResult.Yes) Then
                For Each ctAux As COrdenAPICContingencia In ordenes
                    If ctAux.IdFondo = "" And ctAux.Saldo = "0.00" And ctAux.IdFuenteInfo = "" Then
                        ordenEliminar.Add(ctAux)
                    End If
                Next

                For Each T As COrdenAPICContingencia In ordenEliminar
                    ordenes.Remove(T)
                Next

                Me.grdOrdenesEfe.UpdateLayout()
                Me.grdOrdenesEfe.Items.Refresh()
            End If
        End If

        ValidaCantidadDatos(Me.grdOrdenesEfe)
    End Sub

    Private Sub grdOrdenesEfe_BeginningEdit(ByVal sender As System.Object, ByVal e As System.Windows.Controls.DataGridBeginningEditEventArgs) Handles grdOrdenesEfe.BeginningEdit
        ordenEnEdicion = Me.grdOrdenesEfe.CurrentItem
    End Sub

    Private Sub grdOrdenesEfe_CellEditEnding(ByVal sender As System.Object, ByVal e As System.Windows.Controls.DataGridCellEditEndingEventArgs) Handles grdOrdenesEfe.CellEditEnding
        Dim ordenCambio As COrdenAPICContingencia = New COrdenAPICContingencia()
        Dim ordenActual As COrdenAPICContingencia
        Dim ordenes As ObservableCollection(Of COrdenAPICContingencia) = Me.grdOrdenesEfe.ItemsSource

        Select Case e.EditAction
            Case DataGridEditAction.Cancel
                ordenCambio = TryCast(Me.grdOrdenesEfe.Items(Me.grdOrdenesEfe.Items.Count - 1), COrdenAPICContingencia)

                If ordenCambio.EsEditableNuevo Then
                    ordenes.Remove(ordenCambio)
                    Me.grdOrdenesEfe.UpdateLayout()
                End If
            Case DataGridEditAction.Commit
                If Not sender.CurrentItem Is Nothing Then
                    Dim txtContenidoCelda As Object = sender.Columns(e.Column.DisplayIndex).GetCellContent(sender.CurrentItem)
                    Dim Columna As Integer = e.Column.DisplayIndex
                    ordenActual = TryCast(Me.grdOrdenesEfe.CurrentCell.Item, COrdenAPICContingencia)

                    Try
                        If Columna = 1 Then
                            DirectCast(txtContenidoCelda, System.Windows.Controls.TextBox).Text = Convert.ToDouble(DirectCast(txtContenidoCelda, System.Windows.Controls.TextBox).Text).ToString("###,##0.00")
                        End If
                    Catch ex As Exception
                    End Try
                    ordenActual.EsEditableNuevo = False
                End If
        End Select

        ordenEnEdicion = Nothing
    End Sub

    Private Sub grdOrdenesEfe_PreviewKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Input.KeyEventArgs) Handles grdOrdenesEfe.PreviewKeyDown
        If Keyboard.Modifiers = ModifierKeys.Control AndAlso e.Key = Key.C Then
            Try
                If copiarCeldas(Me.grdOrdenesEfe) = False Then
                    MessageBox.Show("El rango de celdas seleccionado no es correcto, si está editando la celda favor de cancelar la edición y proceder con el copiado.", "Copiar celdas", MessageBoxButton.OK, MessageBoxImage.Exclamation)
                End If
            Catch ex As Exception
                MessageBox.Show("Error TI500. Al intentar copiar celdas: " & ex.Message, "Copiado", MessageBoxButton.OK, MessageBoxImage.Error)
            End Try
        End If
        If Keyboard.Modifiers = ModifierKeys.Control AndAlso e.Key = Key.V Then
            Try
                Dim col As Integer = Me.grdOrdenesEfe.CurrentCell.Column.DisplayIndex
                Dim row As Integer = Me.grdOrdenesEfe.Items.IndexOf(CType(Me.grdOrdenesEfe.CurrentCell.Item, COrdenAPICContingencia))
                Dim celda As DataGridCell = ObtenerCelda(Me.grdOrdenesEfe, row, col)

                Me.grdOrdenesEfe.CancelEdit()
                pegarDatos(Me.grdOrdenesEfe)

            Catch ex As Exception
                MessageBox.Show("Error TI500. " & ex.Message, "Pegar celdas", MessageBoxButton.OK, MessageBoxImage.Error)

                Me.grdOrdenesEfe.CancelEdit(DataGridEditingUnit.Cell)
            End Try
        End If
        If e.Key = Key.Delete Then
            Try
                Dim col As Integer = Me.grdOrdenesEfe.CurrentCell.Column.DisplayIndex
                Dim row As Integer = Me.grdOrdenesEfe.Items.IndexOf(CType(Me.grdOrdenesEfe.CurrentCell.Item, COrdenAPICContingencia))
                Dim celda As DataGridCell = ObtenerCelda(Me.grdOrdenesEfe, row, col)

                If celda.IsEditing = False Then
                    BorraDatosSeleccionados(Me.grdOrdenesEfe)
                End If
            Catch ex As Exception
                MessageBox.Show("Error TI500. " & ex.Message, "Borrar contenido de celdas", MessageBoxButton.OK, MessageBoxImage.Error)
            End Try
        End If
    End Sub

    Private Sub btnInsertarOrdenEfe_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnInsertarOrdenEfe.Click
        Try
            InsertarDatos(Me.grdOrdenesEfe)
        Catch ex As Exception
            MessageBox.Show("Error TI500. " & ex.Message, "Insertar registros", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub grdOrdenesEfe_LoadingRow(ByVal sender As System.Object, ByVal e As System.Windows.Controls.DataGridRowEventArgs) Handles grdOrdenesEfe.LoadingRow
        Dim orden As COrdenAPICContingencia = TryCast(e.Row.Item, COrdenAPICContingencia)
        Dim row As DataRowView = TryCast(e.Row.Item, DataRowView)
        If orden.Mensaje <> "" Then
            e.Row.Background = New SolidColorBrush(Color.FromArgb(255, 242, 220, 219))
        Else
            e.Row.Background = New SolidColorBrush(Color.FromArgb(255, 255, 255, 255))
        End If
    End Sub

    Private Sub btnCargaArchivoEfe_Click(ByVal sender As System.Object, ByVal e As RoutedEventArgs) Handles btnCargaArchivoEfe.Click
        Dim dlg As New Microsoft.Win32.OpenFileDialog()
        Dim blnArchivoElegido As Boolean

        '123
        Dim eventoBit = CBitacoraFRIDA.GenerarEvento(CBitacoraFRIDA.CveEventosBit.CARGAR_ARCHIVO_EFE, CServiciosMacrosSyBaseDB.IDUSUARIO, "CAPICContingencia.xaml -> btnCargaArchivoEfe")


        Try
            dlg.FileName = ""
            dlg.DefaultExt = ".png"
            dlg.Filter = "Excel documents|*.xls;*.xlsx"

            blnArchivoElegido = dlg.ShowDialog()

            If blnArchivoElegido Then

                If Me.grdOrdenesEfe.Items.Count > 0 Then
                    Dim msgPregunta As MessageBoxResult = MessageBox.Show("Al cargar el archivo toda la información que se ha ingresado se perderá, ¿Desea continuar?", "Carga archivo", MessageBoxButton.YesNo, MessageBoxImage.Question)

                    If msgPregunta = MessageBoxResult.Yes Then
                        GoTo continua
                    Else
                        Return
                    End If
                Else
                    GoTo continua
                End If

continua:

                eventoBit.GuadarDetalle("archivo", dlg.FileName)

                Dim lstOrdenes As New ObservableCollection(Of COrdenAPICContingencia)
                Dim wbk As Workbook
                Dim hoja As Worksheet
                Dim Aplicacion As _Application
                Dim rango As Range
                Dim indice As Integer = 0, indiceAux As Integer = 2, TotalRenglones As Integer, TotalColumnas As Integer
                Dim strNombreAuxiliar As String

                Mouse.OverrideCursor = Cursors.Wait

                lstOrdenes = Me.grdOrdenesEfe.ItemsSource
                lstOrdenes.Clear()
                Me.grdOrdenesEfe.UpdateLayout()

                Try
                    Aplicacion = GetObject(, "Excel.Application")
                Catch ex As Exception
                    Aplicacion = CreateObject("Excel.Application")
                End Try

                While indice >= 0
                    indice = dlg.FileName.IndexOf("\", indiceAux)

                    If indice > 0 Then
                        indiceAux = indice + 1
                    End If
                End While

                strNombreAuxiliar = dlg.FileName.Substring(indiceAux, dlg.FileName.Length - indiceAux)

                For Each wbAux As Workbook In Aplicacion.Workbooks
                    If wbAux.Name = strNombreAuxiliar Then
                        wbAux.Close()
                    End If
                Next

                Try
                    wbk = Aplicacion.Workbooks.Open(dlg.FileName)
                Catch ex As Exception
                    Dim errorBit = eventoBit.GuardarError("Error al cargar archivo: " & ex.Message)
                    eventoBit.ActualizarFechaFinDelEvento()
                    Mouse.OverrideCursor = Nothing

                    MessageBox.Show("Error TI500. " & ex.Message & " Si esta modificando otro libro favor de terminar e intentar nuevamente", "Carga archivo", MessageBoxButton.OK, MessageBoxImage.Error)

                    Exit Sub
                End Try

                hoja = wbk.Sheets(1)

                rango = hoja.UsedRange

                TotalRenglones = rango.Rows.Count

                TotalColumnas = rango.Columns.Count

                Dim InicioRenglon As Integer = 1
                Dim InicioRenglonDatos As Integer = 0
                Dim ExcelColumns(Me.grdOrdenesEfe.Columns.Count + 1) As Integer
                'Encontrar columnas de layout

                If MaxRenglones > TotalRenglones Then
                    MaxRenglones = TotalRenglones
                End If

                For renglon = 1 To MaxRenglones Step 1
                    For columna = 1 To TotalColumnas Step 1
                        If Not hoja.Cells(renglon, columna).Value2 Is Nothing Then
                            If EncontrarEncabezado(hoja.Cells(renglon, columna).Value2, Me.grdOrdenesEfe) Then
                                InicioRenglon = renglon
                                Exit For
                                Exit For
                            End If

                        End If
                    Next
                Next


                For grdcolumna = 0 To Me.grdOrdenesEfe.Columns.Count - 1 Step 1
                    For columna = 1 To TotalColumnas Step 1
                        If Not hoja.Cells(InicioRenglon, columna).Value2 Is Nothing Then
                            If grdcolumna = 1 Then
                                If hoja.Cells(InicioRenglon, columna).Value2.ToString.ToUpper.Contains(Me.grdOrdenesEfe.Columns(grdcolumna).Header.ToString.Replace("__", "_").ToUpper) _
                                    And hoja.Cells(InicioRenglon, columna).Value2.ToString.ToUpper.Contains(" VS ") Then
                                    ExcelColumns(grdcolumna) = columna
                                    InicioRenglonDatos = InicioRenglon + 1
                                    Exit For
                                End If
                            Else
                                If hoja.Cells(InicioRenglon, columna).Value2.ToString.ToUpper.Contains(Me.grdOrdenesEfe.Columns(grdcolumna).Header.ToString.Replace("__", "_").ToUpper) Then
                                    ExcelColumns(grdcolumna) = columna
                                    InicioRenglonDatos = InicioRenglon + 1
                                    Exit For
                                End If
                            End If

                        End If
                    Next

                Next


                If ExcelColumns(3) <> 0 Then
                    For columna = 1 To TotalColumnas Step 1
                        If Not hoja.Cells(InicioRenglon, columna).Value2 Is Nothing Then
                            If hoja.Cells(InicioRenglon, columna).Value2.ToString.ToUpper.Contains(Me.grdOrdenesEfe.Columns(1).Header.ToString.Replace("__", "_").ToUpper) Then
                                ExcelColumns(1) = columna
                                Exit For
                            End If
                        End If
                    Next
                End If

                If InicioRenglonDatos = 0 Then
                    wbk.Close()
                    eventoBit.GuadarDetalle("Mensaje carga", "No existe ninguna columna correspondiente al layout.")
                    Mouse.OverrideCursor = Nothing

                    MessageBox.Show("No existe ninguna columna correspondiente al layout. Por favor verifique el archivo e intente subirlo nuevamente", "Carga archivo", MessageBoxButton.OK, MessageBoxImage.Exclamation)
                Else
                    If InicioRenglonDatos <= TotalRenglones Then
                        For renglon = InicioRenglonDatos To TotalRenglones Step 1
                            Dim ordenExcel As New COrdenAPICContingencia()

                            For i = 0 To Me.grdOrdenesEfe.Columns.Count - 1 Step 1
                                If ExcelColumns(i) <> 0 Then
                                    If Not hoja.Cells(renglon, ExcelColumns(i)).Value2 Is Nothing Then
                                        Dim colname As Integer = COrdenAPICContingencia.IndexColumna(Me.grdOrdenesEfe.Columns(i).Header.ToString.Replace("_", ""))
                                        If i = 1 Then
                                            Try
                                                ordenExcel(colname) = Convert.ToDouble(hoja.Cells(renglon, ExcelColumns(i)).Value2.ToString.Trim).ToString("###,##0.00")
                                            Catch ex As Exception
                                                ordenExcel(colname) = hoja.Cells(renglon, ExcelColumns(i)).Value2.ToString.Trim
                                            End Try

                                        Else
                                            ordenExcel(colname) = hoja.Cells(renglon, ExcelColumns(i)).Value2.ToString.Trim
                                        End If

                                    End If
                                End If
                            Next

                            If ordenExcel.IdFondo <> "" Or (ordenExcel.Saldo <> "0.00" And ordenExcel.Saldo <> "") Or ordenExcel.IdFuenteInfo <> "" Then
                                lstOrdenes.Add(ordenExcel)
                            End If
                        Next
                    End If

                    wbk.Close()

                    Me.grdOrdenesEfe.UpdateLayout()
                    eventoBit.ActualizarFechaFinDelEvento()
                    Mouse.OverrideCursor = Nothing

                    MessageBox.Show("Archivo cargado correctamente", "Carga archivo", MessageBoxButton.OK, MessageBoxImage.Information)
                End If

                ValidaCantidadDatos(Me.grdOrdenesEfe)
            End If
        Catch ex As Exception

            Dim errorBit = eventoBit.GuardarError("Error al cargar archivo: " & ex.Message)
            eventoBit.ActualizarFechaFinDelEvento()
            Mouse.OverrideCursor = Nothing

            MessageBox.Show("Error TI500. " & ex.Message, "Carga archivo", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub btnSubirDECALOGEfe_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnSubirDECALOGEfe.Click
        Dim msgResultado As MessageBoxResult
        Dim strRutaTLOADER As String
        Dim lstOrdenesEvaluar As New ObservableCollection(Of COrdenAPICContingencia)
        lstOrdenesEvaluar = Me.grdOrdenesEfe.ItemsSource
        'Me.grdOrdenesEfe.Columns(3).Visibility = System.Windows.Visibility.Hidden
        '123
        Dim eventoBit = CBitacoraFRIDA.GenerarEvento(CBitacoraFRIDA.CveEventosBit.CARGAR_APIC_EFE_DECALOG, CServiciosMacrosSyBaseDB.IDUSUARIO, "CPICContingencia.xaml -> btnSubirDECALOGEfe")
        strRutaTLOADER = APICServicio.ObtieneRutaTLOADERAPIC()

        If File.Exists(strRutaTLOADER) Then
            msgResultado = MessageBox.Show("¿Desea procesar los datos en DECALOG?", "Atención", MessageBoxButton.YesNo, MessageBoxImage.Question)

            If msgResultado = MessageBoxResult.Yes Then
                Mouse.OverrideCursor = Cursors.Wait

                Try
                    Dim strRutaDECALOG As String, strRutaDirectorio As String, strNombrePrefijo As String, strMensajeValidacion As String = String.Empty
                    Dim indice As Integer = 0, indiceAux As Integer = 2

                    APICServicio.ValidarOrdenesEfe(lstOrdenesEvaluar, strMensajeValidacion)
                    Me.grdOrdenesEfe.ItemsSource = Nothing
                    Me.grdOrdenesEfe.ItemsSource = lstOrdenesEvaluar
                    Me.grdOrdenesEfe.UpdateLayout()

                    If strMensajeValidacion.Length = 0 Then
                        strRutaDECALOG = APICServicio.ObtieneRutaArchivoAPICEfectivo()

                        While indice >= 0
                            indice = strRutaDECALOG.IndexOf("\", indiceAux)

                            If indice > 0 Then
                                indiceAux = indice + 1
                            End If
                        End While

                        strRutaDirectorio = strRutaDECALOG.Substring(0, indiceAux - 1)
                        strNombrePrefijo = strRutaDECALOG.Substring(indiceAux, strRutaDECALOG.Length - indiceAux)

                        If Directory.Exists(strRutaDirectorio) Then
                            Try

                                If (From ordenF In lstOrdenesEvaluar
                                   Where ordenF.Mensaje <> "" Select ordenF).Count > 0 Then
                                    'EstiloMensaje(Me.grdOrdenesEfe)
                                    Dim errorBit = eventoBit.GuardarError("Existen errores en registros que se desean enviar a Decalog ")
                                    eventoBit.ActualizarFechaFinDelEvento()
                                    Mouse.OverrideCursor = Nothing
                                    MessageBox.Show("Existen errores en registros que se desean enviar a Decalog.", "Atención", MessageBoxButton.OK, MessageBoxImage.Exclamation)
                                    Exit Sub
                                End If

                                Mouse.OverrideCursor = Cursors.Wait


                                If lstOrdenesEvaluar.Count > 0 Then

                                    Dim NombreFinalArchivo As String = APICServicio.GeneraArchivo(strRutaDirectorio, strNombrePrefijo, lstOrdenesEvaluar, "Efe")
                                    Dim Parametros As String

                                    Parametros = APICServicio.ObtieneParametrosTLOADERAPIC().Replace("@CSMode", "STOP").Replace("@Usuario", CServiciosMacrosSyBaseDB.USUARIO).Replace("@Archivo", NombreFinalArchivo)

                                    Dim intInsercionBitacoraDECALOG As Integer = APICServicio.InsertaBitacoraDECALOG(NombreFinalArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                    If intInsercionBitacoraDECALOG > 0 Then

                                        servGrales.EjecutarProceso(strRutaTLOADER, Parametros, "APICContingencia")

                                        Thread.Sleep(7000)

                                        Dim intVerificacionArchivo As Integer = VerificaArchivoDECALOG(NombreFinalArchivo)

                                        If intVerificacionArchivo = 1 Then
                                            APICServicio.ActualizaBitacoraDECALOG(intInsercionBitacoraDECALOG, intVerificacionArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                            Dim strFolios = ActualizaFolioDECALOG(NombreFinalArchivo, intInsercionBitacoraDECALOG)

                                            tabCompliance.IsEnabled = False
                                            eventoBit.GuadarDetalle("Folios", strFolios)
                                            Mouse.OverrideCursor = Nothing

                                            MessageBox.Show("Operacion realizada con Exito!!. Folio(s) generado(s): " & strFolios, "Generación de órdenes", MessageBoxButton.OK, MessageBoxImage.Information)
                                        ElseIf intVerificacionArchivo = 2 Then
                                            APICServicio.ActualizaBitacoraDECALOG(intInsercionBitacoraDECALOG, intVerificacionArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                            Mouse.OverrideCursor = Nothing
                                            Dim errorBit = eventoBit.GuardarError("Se han encontrado errores o reglas transgedidas")
                                            eventoBit.ActualizarFechaFinDelEvento()
                                            MessageBox.Show("Se han encontrado errores o reglas transgedidas", "Generación de órdenes", MessageBoxButton.OK, MessageBoxImage.Exclamation)

                                            Thread.Sleep(1000)

                                            ActualizaErrorDECALOG(NombreFinalArchivo, intInsercionBitacoraDECALOG)

                                            Dim strContenido As String = File.ReadAllText(NombreFinalArchivo + ".err_text")

                                            tbErrores.Text = strContenido

                                            tabCompliance.IsEnabled = True
                                            tabPosicion.IsSelected = False
                                            tabEfectivo.IsSelected = False
                                            tabCompliance.IsSelected = True
                                        ElseIf intVerificacionArchivo = 0 Then
                                            Dim errorBit = eventoBit.GuardarError("No se obtuvo respuesta de DECALOG")
                                            eventoBit.ActualizarFechaFinDelEvento()
                                            Mouse.OverrideCursor = Nothing

                                            MessageBox.Show("No se obtuvo respuesta de DECALOG, favor de revisar la bitácora de folios para ver el resultado de la operación.", "Generación de órdenes", MessageBoxButton.OK, MessageBoxImage.Exclamation)
                                        ElseIf intVerificacionArchivo = 3 Then
                                            APICServicio.ActualizaBitacoraDECALOG(intInsercionBitacoraDECALOG, intVerificacionArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                            Dim strFolios = ActualizaFolioDECALOG(NombreFinalArchivo, intInsercionBitacoraDECALOG)
                                            eventoBit.GuadarDetalle("Folios", strFolios)
                                            Mouse.OverrideCursor = Nothing

                                            MessageBox.Show("Archivo parcialmente correcto con los folios: " & strFolios & ". También se encontraron errores o reglas transgedidas.", "Generación de órdenes", MessageBoxButton.OK, MessageBoxImage.Exclamation)

                                            Thread.Sleep(1000)

                                            ActualizaErrorDECALOG(NombreFinalArchivo, intInsercionBitacoraDECALOG)
                                            Dim errorBit = eventoBit.GuardarError("Archivo parcialmente correcto con los folios")
                                            eventoBit.ActualizarFechaFinDelEvento()
                                            Dim strContenido As String = File.ReadAllText(NombreFinalArchivo + ".err_text")

                                            tbErrores.Text = strContenido

                                            tabCompliance.IsEnabled = True
                                            tabPosicion.IsSelected = False
                                            tabEfectivo.IsSelected = False
                                            tabCompliance.IsSelected = True
                                        End If
                                    Else
                                        Dim errorBit = eventoBit.GuardarError("Ocurrió un error al guardar el envío del archivo en la bitácora")
                                        eventoBit.ActualizarFechaFinDelEvento()
                                        Mouse.OverrideCursor = Nothing

                                        MessageBox.Show("Ocurrió un error al guardar el envío del archivo en la bitácora", "Generación órdenes", MessageBoxButton.OK, MessageBoxImage.Exclamation)
                                    End If
                                Else
                                    eventoBit.GuadarDetalle("Carga", "No hay órdenes válidas para ser mandadas a DECALOG")
                                    Mouse.OverrideCursor = Nothing

                                    MessageBox.Show("No hay órdenes válidas para ser mandadas a DECALOG", "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Exclamation)

                                    Exit Sub
                                End If
                            Catch ex As Exception
                                Dim errorBit = eventoBit.GuardarError("Error en carga DECALOG " & ex.Message)
                                eventoBit.ActualizarFechaFinDelEvento()
                                Mouse.OverrideCursor = Nothing

                                MessageBox.Show("Error TI500. " & ex.Message, "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Error)
                            End Try
                        Else
                            Dim errorBit = eventoBit.GuardarError("Verificar que existe la ruta: " + strRutaDirectorio)
                            eventoBit.ActualizarFechaFinDelEvento()
                            Mouse.OverrideCursor = Nothing

                            MessageBox.Show("Verificar que existe la ruta: " + strRutaDirectorio + " para almacenar el archivo a procesar en DECALOG", "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Exclamation)
                        End If
                    Else
                        Dim errorBit = eventoBit.GuardarError("Ocurrió un error al validar la información")
                        eventoBit.ActualizarFechaFinDelEvento()
                        Mouse.OverrideCursor = Nothing

                        MessageBox.Show("Ocurrió un error al validar la información", "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Exclamation)
                    End If
                Catch ex As Exception
                    Dim errorBit = eventoBit.GuardarError(ex.Message)
                    eventoBit.ActualizarFechaFinDelEvento()
                    Mouse.OverrideCursor = Nothing

                    MessageBox.Show("Error TI500. " & ex.Message, "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Error)
                End Try
            End If
        Else
            Dim errorBit = eventoBit.GuardarError("Verificar que existe el archivo: " + strRutaTLOADER)
            eventoBit.ActualizarFechaFinDelEvento()
            MessageBox.Show("Verificar que existe el archivo: " + strRutaTLOADER + " para poder cargar los archivos a DECALOG", "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Exclamation)
        End If
    End Sub

#End Region

#Region "UTILERIA"

    Private Function AgregarMenuContextual(ByVal opcion As Integer) As ContextMenu
        Dim miMenuContextual As New ContextMenu
        Dim mnuCopia As New System.Windows.Controls.MenuItem
        Dim mnuPegar As New System.Windows.Controls.MenuItem
        Dim mnuInsertar As New System.Windows.Controls.MenuItem

        mnuCopia.Header = "Copiar"
        miMenuContextual.Items.Add(mnuCopia)
        AddHandler mnuCopia.Click, AddressOf mnuCopiar_click

        mnuInsertar.Header = "Insertar registros al final"
        miMenuContextual.Items.Add(mnuInsertar)
        AddHandler mnuInsertar.Click, AddressOf mnuInsertar_click

        'Este case esta preparado para extender la funcionalidad de las opciones del menú contextual
        Select Case opcion
            Case 0
                mnuPegar.Header = "Pegar"
                miMenuContextual.Items.Add(mnuPegar)
                AddHandler mnuPegar.Click, AddressOf mnuPegar_click
        End Select

        Return miMenuContextual
    End Function

    Private Sub mnuCopiar_click(ByVal sender As Object, ByVal e As RoutedEventArgs)
        Try
            Dim menuItem = CType(sender, MenuItem)
            Dim contextMenu = CType(menuItem.Parent, ContextMenu)
            Dim gridDeDatos = CType(contextMenu.PlacementTarget, DataGrid)
            If copiarCeldas(gridDeDatos) = False Then
                MessageBox.Show("El rango de celdas seleccionado no es correcto, si está editando la celda favor de cancelar la edición y proceder con el copiado.", "Copiar celdas", MessageBoxButton.OK, MessageBoxImage.Exclamation)
            End If
        Catch ex As Exception
            MessageBox.Show("Error TI500. Al intentar copiar celdas: " & ex.Message, "Copiado celdas", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub mnuPegar_click(ByVal sender As Object, ByVal e As RoutedEventArgs)
        Try
            Dim menuItem = CType(sender, MenuItem)
            Dim contextMenu = CType(menuItem.Parent, ContextMenu)
            Dim gridDeDatos = CType(contextMenu.PlacementTarget, DataGrid)
            pegarDatos(gridDeDatos)
        Catch ex As Exception
            MessageBox.Show("Error TI500. " & ex.Message, "Pegar celdas", MessageBoxButton.OK, MessageBoxImage.Exclamation)
        End Try
    End Sub

    Private Sub mnuInsertar_click(ByVal sender As Object, ByVal e As RoutedEventArgs)
        Try
            Dim menuItem = CType(sender, MenuItem)
            Dim contextMenu = CType(menuItem.Parent, ContextMenu)
            Dim gridDeDatos = CType(contextMenu.PlacementTarget, DataGrid)
            InsertarDatos(gridDeDatos)
        Catch ex As Exception
            MessageBox.Show("Error TI500. " & ex.Message, "Insertar registros", MessageBoxButton.OK, MessageBoxImage.Exclamation)
        End Try
    End Sub

    Private Function copiarCeldas(ByRef gridDeDatos As DataGrid) As Boolean
        Try
            Dim lstInterAux As ObservableCollection(Of COrdenAPICContingencia) = gridDeDatos.ItemsSource
            Dim datos As New StringBuilder
            Dim copiadoCorrecto As Boolean = True
            Dim colIni As Integer = Integer.MaxValue
            Dim rowIni As Integer = Integer.MaxValue
            Dim colFin As Integer = Integer.MinValue
            Dim rowFin As Integer = Integer.MinValue
            Dim i As Integer = 0
            Dim j As Integer = 0

            Dim columnasIndex(gridDeDatos.SelectedCells.Count - 1) As Integer
            Dim renglonesIndex(gridDeDatos.SelectedCells.Count - 1) As Integer

            For Each celda As DataGridCellInfo In gridDeDatos.SelectedCells
                renglonesIndex(i) = gridDeDatos.Items.IndexOf(CType(celda.Item, COrdenAPICContingencia))
                columnasIndex(j) = celda.Column.DisplayIndex
                i += 1
                j += 1
            Next

            rowIni = renglonesIndex.Min()
            rowFin = renglonesIndex.Max()
            colIni = columnasIndex.Min()
            colFin = columnasIndex.Max()

            For i = rowIni To rowFin
                For j = colIni To colFin
                    If EsSeleccionadaLaCelda(gridDeDatos, i, j) Then
                        Dim colname As Integer = COrdenAPICContingencia.IndexColumna(gridDeDatos.Columns(j).Header.ToString.Replace("_", ""))
                        datos.Append(lstInterAux(i)(colname).ToString() & vbTab)
                    Else
                        copiadoCorrecto = False
                        GoTo fuera
                    End If
                Next
                datos.Remove(datos.Length - 1, 1)
                datos.Append(vbLf)
            Next

            datos.Remove(datos.Length - 1, 1)

fuera:
            If copiadoCorrecto = True Then
                Clipboard.Clear()
                Clipboard.SetText(datos.ToString())
                Return True
            Else
                Return False
            End If
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    Private Function EsSeleccionadaLaCelda(ByRef gridDeDatos As DataGrid, ByVal indexRow As Integer, ByVal indexCol As Integer) As Boolean
        Try
            Dim row As DataGridRow = gridDeDatos.ItemContainerGenerator.ContainerFromIndex(indexRow)
            Dim cellContent As TextBlock = gridDeDatos.Columns(indexCol).GetCellContent(row)
            Dim objDepend As DependencyObject = cellContent
            Dim celda As DataGridCell = Nothing

            While Not objDepend Is Nothing
                If objDepend.GetType().Name = "DataGridCell" Then
                    celda = objDepend

                    If celda.IsSelected = True Then
                        Return True
                    Else
                        Return False
                    End If
                End If
                objDepend = VisualTreeHelper.GetParent(objDepend)
            End While

            Return False
        Catch ex As Exception
            Return False
        End Try
    End Function

    Private Sub pegarDatos(ByRef gridDeDatos As DataGrid)
        Dim maxColumns = gridDeDatos.Columns.Count
        Dim lstInterAux As ObservableCollection(Of COrdenAPICContingencia) = gridDeDatos.ItemsSource
        Dim datos As CDatosEnFormatoX
        datos = CUtileria.ObtenerDatosClipboard(vbLf, vbTab)

        '1) Validaciones: obtener información del portapapeles
        If datos.Datos.length = 0 Then
            Exit Sub
        End If

        If datos Is Nothing Then
            MessageBox.Show("No se pudo copiar los datos", "Pegado datos", MessageBoxButton.OK, MessageBoxImage.Error)
            gridDeDatos.CancelEdit(DataGridEditingUnit.Cell)
            Exit Sub
        End If

        '2) Validaciones: compatibilidad  
        Dim colTot As Integer = gridDeDatos.Columns.Count - 1
        Dim rowTot As Integer = gridDeDatos.Items.Count

        Dim colActual As Integer = gridDeDatos.SelectedCells.First.Column.DisplayIndex
        Dim rowActual As Integer = gridDeDatos.Items.IndexOf(CType(gridDeDatos.SelectedCells.First.Item, COrdenAPICContingencia))

        If colActual <> maxColumns Then

            'Validar renglones
            If datos.NumeroRenglones > ((rowTot - (rowActual + 1)) + 1) Then
                MessageBox.Show("No coinciden las dimensiones de datos a pegar (R)", "Pegado datos", MessageBoxButton.OK, MessageBoxImage.Error)
                gridDeDatos.CancelEdit(DataGridEditingUnit.Cell)
                Exit Sub
            End If

            If datos.NumeroColumnas.Max > ((colTot - (colActual + 1)) + 1) Then
                MessageBox.Show("No coinciden las dimensiones de datos a pegar (C), recuerde que la columna Mensaje solo es informativa", "Pegado datos", MessageBoxButton.OK, MessageBoxImage.Error)
                gridDeDatos.CancelEdit(DataGridEditingUnit.Cell)
                Exit Sub
            End If

            '2) Realizar copiado  
            Dim i As Integer = 0
            Dim j As Integer = 0

            Dim coontador As Integer = 0
            Dim limRow As Integer = (rowActual + (datos.NumeroRenglones - 1))

            gridDeDatos.UnselectAllCells()

            Try
                For i = rowActual To limRow
                    Dim limCol As Integer = (colActual + (datos.NumeroColumnas(coontador) - 1))

                    For j = colActual To limCol
                        If datos.Datos(i - rowActual)(j - colActual) <> vbLf Then 'And (Not CType(datos.Datos(i - rowActual)(j - colActual), String).Trim().Equals("")) Then
                            Dim row As DataGridRow = gridDeDatos.ItemContainerGenerator.ContainerFromIndex(i)
                            Dim cellContent As TextBlock = gridDeDatos.Columns(j).GetCellContent(row)

                            Dim auxImpDos As String = datos.Datos(i - rowActual)(j - colActual).ToString.Trim()

                            Try
                                If gridDeDatos.Name.Contains("Pos") And j = 4 Then
                                    auxImpDos = Convert.ToDouble(auxImpDos).ToString("###,##0")
                                End If

                                If gridDeDatos.Name.Contains("Efe") And j = 1 Then
                                    auxImpDos = Convert.ToDouble(auxImpDos).ToString("###,##0.00")
                                End If

                                cellContent.Text = auxImpDos
                                Dim colname As Integer = COrdenAPICContingencia.IndexColumna(gridDeDatos.Columns(j).Header.ToString.Replace("_", ""))
                                lstInterAux(i)(colname) = auxImpDos
                            Catch ex As Exception
                                cellContent.Text = auxImpDos
                                Dim colname As Integer = COrdenAPICContingencia.IndexColumna(gridDeDatos.Columns(j).Header.ToString.Replace("_", ""))
                                lstInterAux(i)(colname) = auxImpDos
                            End Try

                            seleccionarcelda(gridDeDatos, i, j)
                        End If
                    Next
                    coontador += 1
                Next
            Catch ex As Exception
                gridDeDatos.Items.Refresh()

                Throw New Exception("No se pudo terminar de copiar los datos debido a que no coinciden con el formato especificado para cada celda", ex)
            End Try
        End If
    End Sub

    Private Sub seleccionarcelda(ByRef gridDeDatos As DataGrid, ByVal indexRow As Integer, ByVal indexCol As Integer)
        Dim row As DataGridRow = gridDeDatos.ItemContainerGenerator.ContainerFromIndex(indexRow)
        Dim cellContent As TextBlock = gridDeDatos.Columns(indexCol).GetCellContent(row)
        Dim objDepend As DependencyObject = cellContent
        Dim celda As DataGridCell = Nothing

        While Not objDepend Is Nothing
            If objDepend.GetType().Name = "DataGridCell" Then
                celda = objDepend

                If celda.IsSelected = False Then
                    celda.IsSelected = True
                    celda.Focus()
                    Exit While
                End If
            End If
            objDepend = VisualTreeHelper.GetParent(objDepend)
        End While
    End Sub

    Private Sub InsertarDatos(ByRef gridDeDatos As DataGrid)
        Dim lstInterAux As ObservableCollection(Of COrdenAPICContingencia) = gridDeDatos.ItemsSource
        Dim datos As CDatosEnFormatoX

        datos = CUtileria.ObtenerDatosClipboard(vbLf, vbTab)

        '1) Validaciones: obtener información del portapapeles
        If datos.Datos.length = 0 Then
            Exit Sub
        End If

        If datos Is Nothing Then
            MessageBox.Show("No se pudo copiar los datos", "Insertado registros", MessageBoxButton.OK, MessageBoxImage.Error)
            gridDeDatos.CancelEdit(DataGridEditingUnit.Cell)
            Exit Sub
        End If

        '2) Validaciones: compatibilidad  
        Dim colTot As Integer = gridDeDatos.Columns.Count - 1

        'Validar solo columnas
        If datos.NumeroColumnas.Max <> colTot Then
            MessageBox.Show("El número de columnas es incorrecto, favor de revisar la información copiada", "Insertado registros", MessageBoxButton.OK, MessageBoxImage.Error)
            gridDeDatos.CancelEdit(DataGridEditingUnit.Cell)
            Exit Sub
        Else
            Dim lstOrdenes As New ObservableCollection(Of COrdenAPICContingencia)

            lstOrdenes = gridDeDatos.ItemsSource

            For renglon = 0 To datos.NumeroRenglones - 1 Step 1
                Dim ordenI As New COrdenAPICContingencia()
                If gridDeDatos.Name.Contains("Pos") Then
                    ordenI.RollUpCode = datos.Datos(renglon)(0).ToString().Trim()

                    ordenI.Serie = datos.Datos(renglon)(1).ToString().Trim()

                    ordenI.ValueType = datos.Datos(renglon)(2).ToString().Trim()

                    ordenI.RefCurveCode = datos.Datos(renglon)(3).ToString().Trim()

                    Try
                        ordenI.NumShares = Convert.ToDouble(datos.Datos(renglon)(4).ToString().Trim()).ToString("###,##0")
                    Catch ex As Exception
                        ordenI.NumShares = datos.Datos(renglon)(4).ToString().Trim()
                    End Try

                    ordenI.IdFuenteInfo = datos.Datos(renglon)(5).ToString().Trim()
                End If

                If gridDeDatos.Name.Contains("Efe") Then
                    ordenI.IdFondo = datos.Datos(renglon)(0).ToString().Trim()
                    Try
                        ordenI.Saldo = Convert.ToDouble(datos.Datos(renglon)(1).ToString().Trim()).ToString("###,##0.00")
                    Catch ex As Exception
                        ordenI.Saldo = datos.Datos(renglon)(1).ToString().Trim()
                    End Try

                    ordenI.IdFuenteInfo = datos.Datos(renglon)(2).ToString().Trim()
                End If
                lstOrdenes.Add(ordenI)
            Next

            gridDeDatos.UpdateLayout()

            ValidaCantidadDatos(gridDeDatos)
        End If
    End Sub

    Private Sub ValidaCantidadDatos(ByRef gridDeDatos As DataGrid)
        If gridDeDatos.Name.Contains("Pos") Then
            If gridDeDatos.Items.Count > 0 Then
                btnSubirDECALOGPos.IsEnabled = True
                btnEliminaOrdenPos.IsEnabled = True
            Else
                btnSubirDECALOGPos.IsEnabled = False
                btnEliminaOrdenPos.IsEnabled = False
            End If
            Me.lblTotalRegPos.Content = "Total Registros: " & gridDeDatos.Items.Count
        Else
            If gridDeDatos.Items.Count > 0 Then
                btnSubirDECALOGEfe.IsEnabled = True
                btnEliminaOrdenEfe.IsEnabled = True
            Else
                btnSubirDECALOGEfe.IsEnabled = False
                btnEliminaOrdenEfe.IsEnabled = False
            End If
            Me.lblTotalRegEfe.Content = "Total Registros: " & gridDeDatos.Items.Count
        End If

    End Sub

    Private Function ObtenerCelda(ByRef miDataGrid As DataGrid, ByVal indexRow As Integer, ByVal indexCol As Integer) As DataGridCell
        Try
            Dim row As DataGridRow = miDataGrid.ItemContainerGenerator.ContainerFromIndex(indexRow)
            Dim cellContent As Object = miDataGrid.Columns(indexCol).GetCellContent(row)

            Dim objDepend As DependencyObject = cellContent
            Dim celda As DataGridCell = Nothing

            While Not objDepend Is Nothing

                If objDepend.GetType().Name = "DataGridCell" Then
                    celda = objDepend
                    Return celda
                End If
                objDepend = VisualTreeHelper.GetParent(objDepend)
            End While
        Catch ex As Exception
            Throw ex
        End Try

        Return Nothing
    End Function

    Private Sub BorraDatosSeleccionados(ByRef gridDeDatos As DataGrid)

        Dim lstInterAux As ObservableCollection(Of COrdenAPICContingencia)

        lstInterAux = gridDeDatos.ItemsSource
        Try
            For Each celda As DataGridCellInfo In gridDeDatos.SelectedCells
                Dim col As Integer = celda.Column.DisplayIndex
                Dim row As Integer = gridDeDatos.Items.IndexOf(CType(celda.Item, COrdenAPICContingencia))

                Dim rowData As DataGridRow = gridDeDatos.ItemContainerGenerator.ContainerFromIndex(row)
                Dim cellContent As TextBlock = gridDeDatos.Columns(col).GetCellContent(rowData)
                cellContent.Text = COrdenAPICContingencia.ValorInicalColumna(col)
                Dim colname As Integer = COrdenAPICContingencia.IndexColumna(gridDeDatos.Columns(col).Header.ToString.Replace("_", ""))
                lstInterAux(row)(colname) = COrdenAPICContingencia.ValorInicalColumna(col)
            Next

        Catch ex As Exception
            Throw ex
        End Try
    End Sub

    Private Function EncontrarEncabezado(ByVal nombre As String, ByRef gridDeDatos As DataGrid) As Boolean
        Dim encontrado As Boolean = False
        Dim i As Integer
        For i = 0 To gridDeDatos.Columns.Count - 1 Step 1
            If nombre.ToUpper.Trim.Contains(gridDeDatos.Columns(i).Header.ToString.Replace("__", "_").ToUpper) Then
                encontrado = True
                Exit For
            End If

        Next
        Return encontrado
    End Function

    Private Function VerificaArchivoDECALOG(ByVal strArchivo As String) As Integer
        Try
            Dim intSegundos As Integer = servGrales.ObtieneSegundosEspera()
            Dim intContador As Integer = 1
            Dim strArchivoTextoError As String = strArchivo + ".err_text"
            Dim strArchivoOK As String = strArchivo + ".ok"
            Dim strArchivoTextoOK As String = strArchivo + ".ok_text"
            Dim strArchivoError As String = strArchivo + ".err"

            strArchivo = strArchivo + ".err_text"

            While (intContador <= intSegundos)
                If File.Exists(strArchivoTextoError) And File.Exists(strArchivoOK) And File.Exists(strArchivoTextoOK) And File.Exists(strArchivoError) Then
                    Dim infArchivoError As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoError)
                    Dim infArchivoTextError As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoTextoError)
                    Dim infArchivoOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoOK)
                    Dim infArchivoTextOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoTextoOK)

                    If infArchivoTextError.Length = 0 And infArchivoError.Length = 0 And infArchivoOK.Length <> 0 And infArchivoTextOK.Length <> 0 Then
                        Return 1
                    ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length > 0 And infArchivoTextOK.Length = 0 And infArchivoOK.Length = 0 Then
                        Return 2
                    ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length = 0 And infArchivoTextOK.Length = 0 And infArchivoOK.Length = 0 Then
                        Return 2
                    ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length > 0 And infArchivoTextOK.Length > 0 And infArchivoOK.Length > 0 Then
                        Return 3
                    End If
                End If

                Thread.Sleep(1000)

                intContador += 1
            End While

            Return 0
        Catch ex As Exception
            Return 0
        End Try
    End Function

    Private Function ActualizaFolioDECALOG(ByVal strArchivo As String, ByVal intId As Integer) As String
        Try
            Dim strNombreArchivoFolio As String = strArchivo + ".ok_text", strFolio As String = String.Empty, strAux As String
            Dim inicioIdx As Integer

            If File.Exists(strNombreArchivoFolio) Then
                Dim infArchivoTextoOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strNombreArchivoFolio)

                If infArchivoTextoOK.Length > 0 Then
                    Dim srArchivoOk As New StreamReader(strNombreArchivoFolio)

                    While Not srArchivoOk.EndOfStream
                        strAux = srArchivoOk.ReadLine()

                        inicioIdx = strAux.IndexOf("N# =")
                        If inicioIdx > 0 Then
                            strFolio = strFolio + (strAux.Substring(inicioIdx + 4, strAux.Length - inicioIdx - 4).Trim()).Replace("Ok,", "").Replace("[", "").Replace("]", "").Replace("(", "").Replace(")", "") + ","
                        End If

                    End While

                    srArchivoOk.Close()

                    If strFolio.Length > 0 Then
                        strFolio = strFolio.Substring(0, strFolio.Length - 1)
                    End If
                    APICServicio.ActualizaFolioDECALOG(intId, strFolio, CServiciosMacrosSyBaseDB.IDUSUARIO)

                    Return strFolio
                Else
                    APICServicio.ActualizaFolioDECALOG(intId, "Archivo sin información", CServiciosMacrosSyBaseDB.IDUSUARIO)

                    Return "Archivo sin información"
                End If
            Else
                Return "No se encontró el archivo"
            End If
        Catch ex As Exception
            Mouse.OverrideCursor = Nothing

            MessageBox.Show("Error TI500. " & ex.Message, "Actualizar Folio Decalog", MessageBoxButton.OK, MessageBoxImage.Error)

            Return ""
        End Try
    End Function

    Private Sub ActualizaErrorDECALOG(ByVal strArchivo As String, ByVal intId As Integer)
        Try
            Dim strNombreArchivoFolio As String = strArchivo + ".err_text", strMensaje As String = String.Empty

            If File.Exists(strNombreArchivoFolio) Then
                Dim infArchivoTextoOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strNombreArchivoFolio)

                If infArchivoTextoOK.Length > 0 Then
                    strMensaje = File.ReadAllText(strNombreArchivoFolio)
                    APICServicio.ActualizaMensajeErrorDECALOG(intId, strMensaje, CServiciosMacrosSyBaseDB.IDUSUARIO)
                Else

                    APICServicio.ActualizaMensajeErrorDECALOG(intId, "Archivo sin información", CServiciosMacrosSyBaseDB.IDUSUARIO)
                End If
            End If
        Catch ex As Exception
            
            Mouse.OverrideCursor = Nothing

            MessageBox.Show("Error TI500. " & ex.Message, "Actualizar Error Decalog", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub EstiloMensaje(ByRef gridDeDatos As DataGrid)
        For i As Integer = 0 To gridDeDatos.Items.Count - 1
            Dim dato = TryCast(gridDeDatos.Items(i), COrdenAPICContingencia)
            Dim row = TryCast(gridDeDatos.ItemContainerGenerator.ContainerFromIndex(i), DataGridRow)
            If dato.Mensaje <> "" Then
                row.Background = New SolidColorBrush(Color.FromArgb(255, 242, 220, 219))
            Else
                row.Background = New SolidColorBrush(Color.FromArgb(255, 255, 255, 255))
            End If

        Next


    End Sub

#End Region

End Class
